package com.ymttest.utils;

import java.io.File;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.junit.experimental.categories.Category;

import com.ymt.core.tool.Logger;

public class AnalysisCase {
	/**
	 * 
	 * 用于返回一个class所有的Junit Test方法
	 * 
	 * @param ClassName
	 *            类名
	 * @return List<Method> Methods
	 */

	public static List<Method> getTestMethods(String ClassName) {
		List<Method> m = new ArrayList<Method>();
		try {
			Method[] ms = Class.forName(ClassName).getDeclaredMethods();
			for (Method m1 : ms) {
				Annotation[] sa = m1.getAnnotations();
				for (Annotation an : sa) {
					if (an.annotationType().equals(Test.class)) {
						m.add(m1);
					}
				}
			}
		} catch (Throwable e) {
			e.printStackTrace();
		}
		return m;
	}

	// 获取url 地址 串
	public static String getFeild(String ClassName) {
		String url = "";
		try {
			if (ClassName.endsWith("Call")) {
				Field field = Class.forName(ClassName).getDeclaredField("opurl");
				field.setAccessible(true);
				url = field.get(null).toString();
				return url;
			} else {
				if (ClassName.indexOf("Ts_") > 0) {
					Field[] fs = Class.forName(ClassName).getDeclaredFields();
					for (Field f : fs) {
						/*
						 * Logger.debug("name:" + f.getName());
						 * Logger.debug("field:" + f.toString());
						 */
						String[] s = f.toString().split(" ");
						if (s.length < 4)
							continue;
						if (s[2].endsWith("Call")) {
							return getFeild(s[2]);
						}
					}
				}
			}
		} catch (Throwable e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return url;
	}

	public static void main(String[] args) {
		// 移除文件AnalysisCase
		TestDataManager.removeFile("./AnalysisCase");
		// 获取文件列表 \\src\\com\\ymt\\testcase com.ymatou.iapi.payment.testcase
		ArrayList<String> flist = TestDataManager.getFilelist(System.getProperty("user.dir") + "/src/com/ymatou");
		for (String fname : flist) {
			// 获取文件内容
			if (!(fname.lastIndexOf(".java") > 0)) {
				Logger.debug(fname + "文件跳过解析！");
				continue;
			}
			List<String> texts = TestDataManager.getLines(fname);
			List<String> caseDescriptionList = new ArrayList<String>();
			String suiteDescription = "";
			for (String s : texts) {
				if (s.trim().length() >= 23 && s.trim().substring(0, 23).equals("Logger.createResultFile")) {
					s = s.substring(27, s.lastIndexOf("\""));
					suiteDescription = s;
				}
				// Logger.generateResult需要参数
				if (s.trim().length() >= 21 && s.trim().substring(0, 21).equals("Logger.generateResult")) {
					String temp = s.substring(22, s.lastIndexOf(")"));
					if (temp.length() <= 2) {
						Logger.debug("Logger.generateResult缺少数据:" + fname);
					}
				}
				// 获取 Logger.start 中的注释 至caseDescriptionList
				// 应该一个文件由多少的Test就有多少个Logger.start
				if (s.trim().length() >= 15 && s.trim().substring(0, 12).equals("Logger.start")) {
					try {
						Logger.debug(s);
						s = s.substring(16, s.lastIndexOf("\""));
						s = s.substring(s.indexOf("\"") + 1);
						caseDescriptionList.add(s);
					} catch (Exception e) {
						caseDescriptionList.add("unknow");
					}
				}
			}
			// 获取文件名 format 成 class包格式
			// 例如：com.ymt.testcase.api.app.order.Ts_GetPayBankList
			fname = fname.substring(fname.indexOf("com"), fname.length() - 5).replace(File.separator, ".");
			// 获取class方法列表
			List<Method> list = AnalysisCase.getTestMethods(fname);
			// 获取open url
			String url = getFeild(fname);
			int i = 0;
			for (Method method : list) {
				String[] tf = fname.split("_");
				String[] mf = method.getName().split("_");
				// 验证class Ts开头 非testcase不应该放在 src\\com\\ymt\\testcase
				if (!fname.substring(fname.lastIndexOf(".") + 1).substring(0, 2).equals("Ts")) {
					Logger.debug("Ts格式错误:" + fname + ":" + method.getName());
				}
				// 验证所有@Test Tc开头
				if (!method.getName().substring(0, 2).equals("Tc")) {
					Logger.debug("Tc格式错误:" + fname + ":" + method.getName());
				}
				// 验证name 同文件 的 Ts Tc 名字应该一致
				try {
					if (!tf[tf.length - 1].equals(mf[mf.length - 2])) {
						Logger.debug("name格式错误:" + fname + ":" + method.getName());
					}
				} catch (Throwable e) {
					e.printStackTrace();
				}
				String level = "";
				Annotation[] ans = method.getAnnotations();
				boolean haslevel = false;
				for (Annotation annotation : ans) {
					if (annotation.annotationType().equals(Category.class)) {
						level = annotation.toString();
						level = level.substring(level.indexOf("tag.") + 4, level.lastIndexOf("]"));
						haslevel = true;
					}
				}
				if (!haslevel) {
					Logger.debug("没有找到合适的case level:" + fname + ":" + method.getName());
				}
				// 分析结果写入文件
				try {
					TestDataManager.appendFileToLine("./AnalysisCase",
							fname + "	" + url + " " + suiteDescription + "	" + method.getName() + "	" + caseDescriptionList.get(i) + "	" + level);
				} catch (Exception e) {
					Logger.debug(e.getMessage());
				}
				i++;
			}

		}
		Logger.debug("Analysis Case completely!");

	}
}
